ABSTRACT
This paper analyzes the author’s travel trajectories to calibrate a bespoke walking cost function based on Tobler’s Hiking Function (THF). This cost function is then used to estimate personalized accessibility on a 3D network in Hong Kong. Beyond highlighting the general importance of slope in modelling walkability, the calibrated function results in greater estimates of accessibility than the original THF. This is partly interpreted as an outcome of the presence of staircases in the hiking data that increase walking speeds on steep slopes. The resulting cost function is arguably more reflective of an urban walking context than the THF’s unimproved terrain.
KEYWORDS
Hiking function, route choice, trajectory analysis, fitness tracker, accessibility analysis
QUESTIONS
Hong Kong is an intensely three-dimensional city, not only in terms of its complex ‘volumetric’ built environment (Bruyns et al., 2021), but also its mountainous terrain. While working at the Hong Kong Polytechnic University, I took up hiking on the city’s extensive trail network. But as a quantitative geographer with a general interest in the potential of sensors for personalized urban data analysis, I could not help but to combine work and leisure activities and utilized my mobile phone and smart watch to capture data on my physical performance. In particular, I am interested in how closely my captured travel trajectories align with Tobler’s (1993) ‘hiking function’ and how the calibrated cost function can be used for personalized predictive accessibility analysis in a 3D network context.
While Tobler’s Hiking Function (THF) has a long history of applications in the field of archaeology, Goodchild (2020) comments on the increasing usefulness of hiking functions in a variety of topic areas in geographical analysis (and includes an early graph of this paper’s data). Indeed, the THF is increasingly utilized in transport geography as a cost function in 3D surface (e.g. water access in Páez et al. (2020)) and linear network (e.g. access to rapid transit stations in Higgins (2019)) analysis. Other researchers have utilized new sources of activity data to calibrate different cost functions (Brundson, 2018; Campbell et al., 2019; Irmischer & Clarke, 2018; Pingel, 2010). Some version of the THF also appears to underpin routing suggestions on sloped terrain in Google Maps (Goodchild, 2020). However, no research has calibrated a bespoke cost function and employed it for personalized urban accessibility analysis.
METHODS
Published several decades ago, Tobler calibrated the hiking function to coarse isoline data from Imhof (1950) and uses an exponential function to model the connection between velocity and slope:
\[
v = \alpha * e^{(-\beta_1 |g + \beta_2|)}
\]
Where \(v\) is walking velocity in km/h, \(\alpha\) is a constant that controls the maximum velocity, \(g\) is the gradient of the terrain measured as the tangent of the angle of the slope in the direction of travel, \(\beta_1\) controls the rate of decline as the gradient increases, and \(\beta_2\) offsets the gradient by some amount to capture how walking speeds are highest on a slight downward gradient. In Tobler’s original formulation, \(\alpha = 6 kph\), \(\beta_1 = 3.5\), and \(\beta_2 = 0.05\) so that the maximum walking velocity of 6 km/h is achieved at a gradient of -5%.
To answer the research questions posed earlier, I collected trajectory data over 4 hikes on the trails around Lung Fu Shan peak and the Pinewood Battery behind the University of Hong Kong in Central and Western District in 2018. The trails themselves feature a mix of paved segments and dirt paths as well as stairs at the steepest sections, making them a useful proxy for more urban walking. Data were collected using an Apple iPhone 8 and Apple Watch Series 0 through the ‘Outdoor Walk’ tracking in the Fitness application. This device combination captures latitude and longitude positioning using the iPhone’s GPS receiver, height from sea level using the barometer (precision of 0.1m), and heart rate readings using the heart rate monitor on the Apple Watch. The phone applies some smoothing algorithm to the GPS data and can also use the accelerometer and gyroscope in the watch to augment GPS positional accuracy in areas with poor or no GPS signal, although these features are opaque to the user. Readings were captured from the sensors at 1-second intervals. The resulting workouts were exported as gpx files using the Run Gap app for iOS. The trajectories were cleaned to remove the beginning of the walk to the trail (where the accuracy of GPS readings is compromised by tall buildings) and a handful of stops to rest during the hike. The exported trajectories and elevation profile for one of the hikes is shown in Figure 1.
To estimate accessibility, a 3D pedestrian network (LandsD, 2021; Sun et al., 2019) is prepared in a similar manner to that outlined in Higgins (2019a), including splitting links into 10m or less segments to improve the accuracy of slope-based travel times and specifying anisotropic travel costs. For simplicity, the travel speed of any mechanized links (e.g. travelator, elevator) is set to 2km/h. Origins and destinations for the accessibility analysis correspond to building centroids in the hilly Central and Western District and travel times are modelled using ArcGIS Pro.

FINDINGS
To compare my walk speed with that predicted by Tobler’s function, nonlinear least squares was used to fit Eq. 1 to the data and results are presented in Table 1 and graphed in Figure 2. To test the sensitivity of the estimated results to the temporal scale of the trajectory data, I employed two aggregation strategies including collapsing collapsed the trajectories into 3s, 5s, and 10s time intervals and calculating average speeds at 1% gradient intervals. The sensitivity analysis suggests that the models are reasonably stable in parameters. The exception is the \(\beta_2\) offset parameter which is insignificant in all binned models, indicating the cost curves in this category are estimated to be symmetric around a 0% gradient. Recognizing that neither AIC or BIC are useful for comparing model fit across different sample sizes, I focus on the results for the original raw 1s data given the reasonably stable parameter estimates across all model specifications.
───────────────────────────────────────────────────────────────────────────────
1s_raw 3s_agg 5s_agg 10s_agg 1s_bin 3s_bin
─────────────────────────────────────────────────────────────────────────
a 4.607 *** 4.643 *** 4.636 *** 4.637 *** 4.897 *** 4.599 ***
(0.014) (0.021) (0.027) (0.038) (0.120) (0.064)
b1 1.542 *** 1.694 *** 1.696 *** 1.723 *** 1.639 *** 1.615 ***
(0.019) (0.032) (0.041) (0.058) (0.069) (0.045)
b2 0.033 *** 0.017 *** 0.013 *** 0.014 *** -0.011 -0.006
(0.001) (0.002) (0.002) (0.003) (0.009) (0.005)
─────────────────────────────────────────────────────────────────────────
N 14449 4810 2881 1436 172 150
AIC 37617.827 11938.276 7093.872 3488.195 256.195 61.704
BIC 37648.140 11964.190 7117.735 3509.274 268.785 73.747
───────────────────────────────────────────────────────────────────────────────
*** p < 0.001; ** p < 0.01; * p < 0.05.
Column names: names, 1s_raw, 3s_agg, 5s_agg, 10s_agg, 1s_bin, 3s_bin, 5s_bin, 10s_bin
7/9 columns shown.

Results from the 1s raw model indicate that my maximum average walking speed is a bit slower than what Tobler (1993) would predict at about 4.4 km/h. The fit function suggests my maximum walking speed of about 4.6km/h occurs on about a -3.3% gradient rather than the -5% in Tobler’s formulation. On the other hand, the I tend to be faster at higher slopes than predicted by the original THF, likely due to the prevalence of staircases on the steepest sections of the trail.
To estimate the effects of the cost function on personalized accessibility analysis, a simple scenario is crafted wherein I examine the spatial distribution of buildings that have access to the Kinwick Centre within 15 min of walking. Situated in the SoHo neighbourhood, the Kinwick Centre houses a grocery store and gym and is an interesting destination due to its location in the topographically-rich SoHo neighbourhood about halfway up the 800m Central-Mid-Levels escalator system. Figure 3 shows a 15 min isochrone calculated to the Kinwick Centre using the cost function calibrated to my 1s data.

After running an origin-destination cost matrix calculation, accessibility results reveal that the function fit to my travel performance results in 2,233 buildings within a 15 min walk to the Kinwick Centre, which is 10.5% more than the number estimated using the original THF. Beyond my base physical ability, it seems likely that this is an outcome of the staircases in the hiking trajectories. While the presence of staircases differs from the unimproved terrain used to calibrate the original THF and affects the comparability of the cost functions, the trail context used to calibrate my cost function is arguably more reflective of walking conditions in an urban context where stairs are used to enable higher speeds on steeper slopes. For comparison, assuming the network was 2D would result in 2,425 buildings within a 15 min walk which would overestimate my accessibility by about 8.6% and 20% compared to the 3D network using my fit function and the THF respectively.
While the data uncertainty caveats outlined in Goodchild (2020) apply in the calibration of the bespoke cost function and propagate to the accessibility analysis, these findings indicate the strong role of cost functions in calculating accessibility on 3D networks, the potential overestimation of access that can occur when assuming networks are planar, and the potential for underestimating access when using the THF compared to a calibrated function. Looking ahead, the proliferation of sensors on consumer-grade smart devices suggests that we are not far off from a future where the suite of movement data being collected can be utilized to personalize suggestions for routing and analyses of accessibility when using active modes on networks rich in topography.
REFERENCES
Brundson, C. (2018). Tobler’s Hiking Function. Retrieved from https://rpubs.com/chrisbrunsdon/hiking
Bruyns, G. J., Higgins, C. D., & Nel, D. H. (2020). Urban Volumetrics: From vertical to volumetric urbanization and its extensions to empirical morphological analysis. Urban Studies, 1-19. https://doi.org/10.1177/0042098020936970.
Campbell, M. J., Dennison, P. E., Butler, B. W., & Page, W. G. (2019). Using crowdsourced fitness tracker data to model the relationship between slope and travel rates. Applied Geography, 106, 93-107. https://doi.org/10.1016/j.apgeog.2019.03.008
Goodchild, M. F. (2020). Beyond Tobler’s Hiking Function. Geographical Analysis, 52(4), 558-569. https://doi.org/10.1111/gean.12253
Higgins, C. D. (2019). A 4D spatio-temporal approach to modelling land value uplift from rapid transit in high density and topographically-rich cities. Landscape and Urban Planning, 185, 68-82. https://doi.org/10.1016/j.landurbplan.2018.12.011
Imhof, E. (1950). Gelände und Karte. Zurich: Rentsch.
Irmischer, I. J., & Clarke, K. C. (2018). Measuring and modeling the speed of human navigation. Cartography and Geographic Information Science, 45(2), 177-186. https://doi.org/10.1080/15230406.2017.1292150
LandsD. (2021, June). 3D Pedestrian Network. Retrieved from data.gov.hk: https://data.gov.hk/en-data/dataset/hk-landsd-openmap-3d-pedestrian-network
Páez, A., Anjum, Z., Dickson-Anderson, S. E., Schuster-Wallace, C. J., Ramos, B. M., & Higgins, C. D. (2020). Comparing distance, time, and metabolic energy cost functions for walking accessibility in infrastructure-poor regions. Journal of Transport Geography, 82, 102564. https://doi.org/10.1016/j.jtrangeo.2019.102564
Pingel, T. J. (2010). Modeling Slope as a Contributor to Route Selection in Mountainous Areas. Cartography and Geographic Information Science, 37, 137-148. https://doi.org/10.1559/152304010791232163
Sun, G., Webster, C., & Zhang, X. (2019). Connecting the city: A three-dimensional pedestrian network of Hong Kong. Environment and Planning B: Urban Analytics and City Science, 1-16. https://doi.org/10.1177%2F2399808319847204
Tobler, W. (1993). Three presentations on geographical analysis and modeling. Santa Barbara: National Center for Geographic Information and Analysis.
LS0tCnRpdGxlOiAiSGlraW5nIHdpdGggVG9ibGVyOiBUcmFja2luZyBNb3ZlbWVudCBhbmQgQ2FsaWJyYXRpbmcgYSBDb3N0IEZ1bmN0aW9uIGZvciBQZXJzb25hbGl6ZWQgM0QgQWNjZXNzaWJpbGl0eSIKYXV0aG9yOgogIC0gbmFtZTogQ2hyaXN0b3BoZXIgRC4gSGlnZ2lucwogICAgZW1haWw6IGNkLmhpZ2dpbnNAdXRvcm9udG8uY2EKICAgIGFmZmlsaWF0aW9uOiBVbml2ZXJzaXR5IG9mIFRvcm9udG8gU2NhcmJvcm91Z2gKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBBQlNUUkFDVApUaGlzIHBhcGVyIGFuYWx5emVzIHRoZSBhdXRob3LigJlzIHRyYXZlbCB0cmFqZWN0b3JpZXMgdG8gY2FsaWJyYXRlIGEgYmVzcG9rZSB3YWxraW5nIGNvc3QgZnVuY3Rpb24gYmFzZWQgb24gVG9ibGVy4oCZcyBIaWtpbmcgRnVuY3Rpb24gKFRIRikuIFRoaXMgY29zdCBmdW5jdGlvbiBpcyB0aGVuIHVzZWQgdG8gZXN0aW1hdGUgcGVyc29uYWxpemVkIGFjY2Vzc2liaWxpdHkgb24gYSAzRCBuZXR3b3JrIGluIEhvbmcgS29uZy4gQmV5b25kIGhpZ2hsaWdodGluZyB0aGUgZ2VuZXJhbCBpbXBvcnRhbmNlIG9mIHNsb3BlIGluIG1vZGVsbGluZyB3YWxrYWJpbGl0eSwgdGhlIGNhbGlicmF0ZWQgZnVuY3Rpb24gcmVzdWx0cyBpbiBncmVhdGVyIGVzdGltYXRlcyBvZiBhY2Nlc3NpYmlsaXR5IHRoYW4gdGhlIG9yaWdpbmFsIFRIRi4gVGhpcyBpcyBwYXJ0bHkgaW50ZXJwcmV0ZWQgYXMgYW4gb3V0Y29tZSBvZiB0aGUgcHJlc2VuY2Ugb2Ygc3RhaXJjYXNlcyBpbiB0aGUgaGlraW5nIGRhdGEgdGhhdCBpbmNyZWFzZSB3YWxraW5nIHNwZWVkcyBvbiBzdGVlcCBzbG9wZXMuIFRoZSByZXN1bHRpbmcgY29zdCBmdW5jdGlvbiBpcyBhcmd1YWJseSBtb3JlIHJlZmxlY3RpdmUgb2YgYW4gdXJiYW4gd2Fsa2luZyBjb250ZXh0IHRoYW4gdGhlIFRIRuKAmXMgdW5pbXByb3ZlZCB0ZXJyYWluLgoKIyBLRVlXT1JEUwpIaWtpbmcgZnVuY3Rpb24sIHJvdXRlIGNob2ljZSwgdHJhamVjdG9yeSBhbmFseXNpcywgZml0bmVzcyB0cmFja2VyLCBhY2Nlc3NpYmlsaXR5IGFuYWx5c2lzCgpgYGB7ciBsb2FkIHBhY2thZ2VzLCBtZXNzYWdlID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeShicm9vbSkKbGlicmFyeShodXh0YWJsZSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc2YpCmxpYnJhcnkodG1hcCkKCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcucGF0aCA9ICJpbWcvIikKYGBgCgpgYGB7ciBkZWZpbmUgaGVscGVyIGZ1bmN0aW9uc30KdG9ibGVyX2YgPC0gZnVuY3Rpb24oYSwgZywgYjEsIGIyKXthICogZXhwKC1iMSphYnMoZyArIGIyKSl9CgpkaXN0YW5jZTJEIDwtIGZ1bmN0aW9uKHgxLCB4MiwgeTEsIHkyKXsKICBkaXN0MkQgPC0gc3FydCgoeDIgLSB4MSleMiArICh5MiAtIHkxKV4yKQogIHJldHVybihkaXN0MkQpfQoKZGlzdGFuY2UzRCA8LSBmdW5jdGlvbih4MSwgeDIsIHkxLCB5MiwgejEsIHoyKXsKICBkaXN0M0QgPC0gc3FydCgoeDIgLSB4MSleMiArICh5MiAtIHkxKV4yICsgKHoyIC0gejEpXjIpCiAgcmV0dXJuKGRpc3QzRCl9CgpkZl9wcmVwIDwtIGZ1bmN0aW9uKGRmKXsKICBkZiAlPD4lIHRyYW5zbXV0ZShzdGFydF90aW1lID0gdGltZSwgc3RhcnRfeiA9IGVsZSwgZ2VvbWV0cnkpICU+JSAKICBjYmluZChzdF9jb29yZGluYXRlcyhkZikpICU+JQogIHN0X2Ryb3BfZ2VvbWV0cnkoKSAlPiUKICByZW5hbWUoc3RhcnRfeCA9IFgsIHN0YXJ0X3kgPSBZKQogIHJldHVybihkZil9CgpkZl9jYWxjdWxhdGUgPC0gZnVuY3Rpb24oZGYsIHJvd19kdXIpewogICMgZmlyc3Qgc2VlIGlmIHRoZSByb3cgZHVyYXRpb24gdmFsdWUgaXMgMSwgaWYgc28ganVzdCBrZWVwIHRoZSBvcmlnaW5hbCBkZgogIGlmZWxzZShyb3dfZHVyICE9IDEsIAogICAgICAgICAgY2FsY19kZiA8LSBkZiAlPiUgZmlsdGVyKHJvd19udW1iZXIoKSAlJSByb3dfZHVyID09IDEpLCAKICAgICAgICAgIGNhbGNfZGYgPC0gZGYpCiAgCiAgY2FsY19kZiAlPD4lCiAgbXV0YXRlKGVuZF90aW1lID0gbGVhZChzdGFydF90aW1lKSwKICAgICAgICAgZW5kX3ggPSBsZWFkKHN0YXJ0X3gpLAogICAgICAgICBlbmRfeSA9IGxlYWQoc3RhcnRfeSksCiAgICAgICAgIGVuZF96ID0gbGVhZChzdGFydF96KSwKICAgICAgICAgZHVyYXRpb24gPSBhcy5udW1lcmljKGVuZF90aW1lIC0gc3RhcnRfdGltZSksCiAgICAgICAgIGxlbmd0aDNEID0gZGlzdGFuY2UzRChzdGFydF94LCBlbmRfeCwgc3RhcnRfeSwgZW5kX3ksIHN0YXJ0X3osIGVuZF96KSwKICAgICAgICAgc3BlZWQgPSAobGVuZ3RoM0QvZHVyYXRpb24pICogMy42LAogICAgICAgICBncmFkaWVudCA9IChlbmRfeiAtIHN0YXJ0X3opL2Rpc3RhbmNlMkQoc3RhcnRfeCwgZW5kX3gsIHN0YXJ0X3ksIGVuZF95KSwKICAgICAgICAgI2JpbiA9IGN1dChncmFkaWVudCwgYnJlYWtzPWMoLTEsIHNlcSgtMS4wMjUsIDEuMDI1LCBieT0uMDEpKSwgbGFiZWxzPXNlcSgtMSwgMS4wMSwgLjAxKSksCiAgICAgICAgICNiaW4gPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihiaW4pKQogICAgICAgICBiaW4gPSByb3VuZChncmFkaWVudCwgZGlnaXRzID0gMikpICU+JSAKICAKICAjIGtlZXAgb25seSB0aGUgc2VsZWN0ZWQgaW50ZXJ2YWxzIGFuZCBncmFkaWVudHMgYmV0d2VlbiAtMSBhbmQgMQogIGZpbHRlcihkdXJhdGlvbiA9PSByb3dfZHVyLCAKICAgICAgICAgYmV0d2VlbihncmFkaWVudCwgLTEsIDEpKQogIHJldHVybihjYWxjX2RmKX0KYGBgCgpgYGB7ciBsb2FkIGFuZCBwcmVwYXJlIGdweCBkYXRhLCBpbmNsdWRlID0gRkFMU0V9Cmhpa2VfYXByaWxfMjIgPC0gc3RfcmVhZCgiLi9kYXRhL2hpa2VfYXByaWxfMjIuZ3B4IiwgbGF5ZXIgPSAidHJhY2tfcG9pbnRzIikgJT4lIHN0X3RyYW5zZm9ybShjcnMgPSAyMzI2KSAlPiUgZGZfcHJlcCgpCmhpa2VfYXByaWxfMjkgPC0gc3RfcmVhZCgiLi9kYXRhL2hpa2VfYXByaWxfMjkuZ3B4IiwgbGF5ZXIgPSAidHJhY2tfcG9pbnRzIikgJT4lIHN0X3RyYW5zZm9ybShjcnMgPSAyMzI2KSAlPiUgZGZfcHJlcCgpCmhpa2VfbWF5XzEgPC0gc3RfcmVhZCgiLi9kYXRhL2hpa2VfbWF5XzEuZ3B4IiwgbGF5ZXIgPSAidHJhY2tfcG9pbnRzIikgJT4lIHN0X3RyYW5zZm9ybShjcnMgPSAyMzI2KSAlPiUgZGZfcHJlcCgpCmhpa2VfbWF5XzE5IDwtIHN0X3JlYWQoIi4vZGF0YS9oaWtlX21heV8xOS5ncHgiLCBsYXllciA9ICJ0cmFja19wb2ludHMiKSAlPiUgc3RfdHJhbnNmb3JtKGNycyA9IDIzMjYpICU+JSBkZl9wcmVwKCkKCmhpa2VfZGF0YSA8LSBsaXN0KAogIGhpa2VfMXMgPSByYmluZChkZl9jYWxjdWxhdGUoaGlrZV9hcHJpbF8yMiwgMSksIGRmX2NhbGN1bGF0ZShoaWtlX2FwcmlsXzI5LCAxKSwgZGZfY2FsY3VsYXRlKGhpa2VfbWF5XzEsIDEpLCBkZl9jYWxjdWxhdGUoaGlrZV9tYXlfMTksIDEpKSAlPiUgCiAgICBtdXRhdGUoZGF0YSA9ICJoaWtlXzFzIiwgdHlwZSA9ICJyYXciKSwKICBoaWtlXzNzID0gcmJpbmQoZGZfY2FsY3VsYXRlKGhpa2VfYXByaWxfMjIsIDMpLCBkZl9jYWxjdWxhdGUoaGlrZV9hcHJpbF8yOSwgMyksIGRmX2NhbGN1bGF0ZShoaWtlX21heV8xLCAzKSwgZGZfY2FsY3VsYXRlKGhpa2VfbWF5XzE5LCAzKSkgICU+JSAKICAgIG11dGF0ZShkYXRhID0gImhpa2VfM3MiLCB0eXBlID0gInJhdyIpLAogIGhpa2VfNXMgPSByYmluZChkZl9jYWxjdWxhdGUoaGlrZV9hcHJpbF8yMiwgNSksIGRmX2NhbGN1bGF0ZShoaWtlX2FwcmlsXzI5LCA1KSwgZGZfY2FsY3VsYXRlKGhpa2VfbWF5XzEsIDUpLCBkZl9jYWxjdWxhdGUoaGlrZV9tYXlfMTksIDUpKSAgJT4lIAogICAgbXV0YXRlKGRhdGEgPSAiaGlrZV81cyIsIHR5cGUgPSAicmF3IiksCiAgaGlrZV8xMHMgPSByYmluZChkZl9jYWxjdWxhdGUoaGlrZV9hcHJpbF8yMiwgMTApLCBkZl9jYWxjdWxhdGUoaGlrZV9hcHJpbF8yOSwgMTApLCBkZl9jYWxjdWxhdGUoaGlrZV9tYXlfMSwgMTApLCBkZl9jYWxjdWxhdGUoaGlrZV9tYXlfMTksIDEwKSkgJT4lIAogICAgbXV0YXRlKGRhdGEgPSAiaGlrZV8xMHMiLCB0eXBlID0gInJhdyIpKQoKaGlrZV9kYXRhIDwtIGJpbmRfcm93cyhoaWtlX2RhdGEpCgpoaWtlX2RhdGFfYmlubmVkIDwtIGxpc3QoCiAgaGlrZV8xc19iaW5uZWQgPSBoaWtlX2RhdGEgJT4lIGZpbHRlcihkYXRhID09ICJoaWtlXzFzIikgJT4lIGdyb3VwX2J5KGJpbikgJT4lIAogICAgc3VtbWFyaXplKGJpbl9zcGVlZCA9IG1lYW4oc3BlZWQpKSAlPiUgcmVuYW1lKGdyYWRpZW50ID0gYmluLCBzcGVlZCA9IGJpbl9zcGVlZCkgJT4lIAogICAgbXV0YXRlKGRhdGEgPSAiaGlrZV8xcyIsIHR5cGUgPSAiYmlubmVkIiksCiAgaGlrZV8zc19iaW5uZWQgPSBoaWtlX2RhdGEgJT4lIGZpbHRlcihkYXRhID09ICJoaWtlXzNzIikgJT4lIGdyb3VwX2J5KGJpbikgJT4lIAogICAgc3VtbWFyaXplKGJpbl9zcGVlZCA9IG1lYW4oc3BlZWQpKSAlPiUgcmVuYW1lKGdyYWRpZW50ID0gYmluLCBzcGVlZCA9IGJpbl9zcGVlZCkgJT4lIAogICAgbXV0YXRlKGRhdGEgPSAiaGlrZV8zcyIsIHR5cGUgPSAiYmlubmVkIiksCiAgaGlrZV81c19iaW5uZWQgPSBoaWtlX2RhdGEgJT4lIGZpbHRlcihkYXRhID09ICJoaWtlXzVzIikgJT4lIGdyb3VwX2J5KGJpbikgJT4lIAogICAgc3VtbWFyaXplKGJpbl9zcGVlZCA9IG1lYW4oc3BlZWQpKSAlPiUgcmVuYW1lKGdyYWRpZW50ID0gYmluLCBzcGVlZCA9IGJpbl9zcGVlZCkgJT4lIAogICAgbXV0YXRlKGRhdGEgPSAiaGlrZV81cyIsIHR5cGUgPSAiYmlubmVkIiksCiAgaGlrZV8xMHNfYmlubmVkID0gaGlrZV9kYXRhICU+JSBmaWx0ZXIoZGF0YSA9PSAiaGlrZV8xMHMiKSAlPiUgZ3JvdXBfYnkoYmluKSAlPiUgCiAgICBzdW1tYXJpemUoYmluX3NwZWVkID0gbWVhbihzcGVlZCkpICU+JSByZW5hbWUoZ3JhZGllbnQgPSBiaW4sIHNwZWVkID0gYmluX3NwZWVkKSAlPiUgCiAgICBtdXRhdGUoZGF0YSA9ICJoaWtlXzEwcyIsIHR5cGUgPSAiYmlubmVkIikpCgpoaWtlX2RhdGFfYmlubmVkIDwtIGJpbmRfcm93cyhoaWtlX2RhdGFfYmlubmVkKQpgYGAKCmBgYHtyIGVzdGltYXRlIG5scyBtb2RlbHMsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpoaWtlX2RhdGFfbmxzX2ZpdCA8LSBsaXN0KAogIGhpa2VfMXMgPSBubHMoc3BlZWQgfiB0b2JsZXJfZihhLCBnID0gZ3JhZGllbnQsIGIxLCBiMiksIHN0YXJ0ID0gbGlzdChhID0gNiwgYjEgPSAzLjUsIGIyID0gMC4wNSksIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBoaWtlX2RhdGEgJT4lIGZpbHRlcihkYXRhID09ICJoaWtlXzFzIiAmIHR5cGUgPT0gInJhdyIpKSwKICBoaWtlXzNzID0gbmxzKHNwZWVkIH4gdG9ibGVyX2YoYSwgZyA9IGdyYWRpZW50LCBiMSwgYjIpLCBzdGFydCA9IGxpc3QoYSA9IDYsIGIxID0gMy41LCBiMiA9IDAuMDUpLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gaGlrZV9kYXRhICU+JSBmaWx0ZXIoZGF0YSA9PSAiaGlrZV8zcyIgJiB0eXBlID09ICJyYXciKSksCiAgaGlrZV81cyA9IG5scyhzcGVlZCB+IHRvYmxlcl9mKGEsIGcgPSBncmFkaWVudCwgYjEsIGIyKSwgc3RhcnQgPSBsaXN0KGEgPSA2LCBiMSA9IDMuNSwgYjIgPSAwLjA1KSwgCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGhpa2VfZGF0YSAlPiUgZmlsdGVyKGRhdGEgPT0gImhpa2VfNXMiICYgdHlwZSA9PSAicmF3IikpLAogIGhpa2VfMTBzID0gbmxzKHNwZWVkIH4gdG9ibGVyX2YoYSwgZyA9IGdyYWRpZW50LCBiMSwgYjIpLCBzdGFydCA9IGxpc3QoYSA9IDYsIGIxID0gMy41LCBiMiA9IDAuMDUpLCAKICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGhpa2VfZGF0YSAlPiUgZmlsdGVyKGRhdGEgPT0gImhpa2VfMTBzIiAmIHR5cGUgPT0gInJhdyIpKSwKICBoaWtlXzFzX2Jpbm5lZCA9IG5scyhzcGVlZCB+IHRvYmxlcl9mKGEsIGcgPSBncmFkaWVudCwgYjEsIGIyKSwgc3RhcnQgPSBsaXN0KGEgPSA2LCBiMSA9IDMuNSwgYjIgPSAwLjA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGhpa2VfZGF0YV9iaW5uZWQgJT4lIGZpbHRlcihkYXRhID09ICJoaWtlXzFzIiYgdHlwZSA9PSAiYmlubmVkIikpLAogIGhpa2VfM3NfYmlubmVkID0gbmxzKHNwZWVkIH4gdG9ibGVyX2YoYSwgZyA9IGdyYWRpZW50LCBiMSwgYjIpLCBzdGFydCA9IGxpc3QoYSA9IDYsIGIxID0gMy41LCBiMiA9IDAuMDUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGhpa2VfZGF0YV9iaW5uZWQgJT4lIGZpbHRlcihkYXRhID09ICJoaWtlXzNzIiYgdHlwZSA9PSAiYmlubmVkIikpLAogIGhpa2VfNXNfYmlubmVkID0gbmxzKHNwZWVkIH4gdG9ibGVyX2YoYSwgZyA9IGdyYWRpZW50LCBiMSwgYjIpLCBzdGFydCA9IGxpc3QoYSA9IDYsIGIxID0gMy41LCBiMiA9IDAuMDUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGhpa2VfZGF0YV9iaW5uZWQgJT4lIGZpbHRlcihkYXRhID09ICJoaWtlXzVzIiYgdHlwZSA9PSAiYmlubmVkIikpLAogIGhpa2VfMTBzX2Jpbm5lZCA9IG5scyhzcGVlZCB+IHRvYmxlcl9mKGEsIGcgPSBncmFkaWVudCwgYjEsIGIyKSwgc3RhcnQgPSBsaXN0KGEgPSA2LCBiMSA9IDMuNSwgYjIgPSAwLjA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gaGlrZV9kYXRhX2Jpbm5lZCAlPiUgZmlsdGVyKGRhdGEgPT0gImhpa2VfMTBzIiYgdHlwZSA9PSAiYmlubmVkIikpCikKbmFtZXMoaGlrZV9kYXRhX25sc19maXQpIDwtIGMoIjFzX3JhdyIsICIzc19hZ2ciLCAiNXNfYWdnIiwgIjEwc19hZ2ciLCAiMXNfYmluIiwgIjNzX2JpbiIsICI1c19iaW4iLCAiMTBzX2JpbiIpCgpubHNfcmVzdWx0cyA8LSBodXhyZWcoaGlrZV9kYXRhX25sc19maXQsIHN0YXRpc3RpY3MgPSBjKCJOIiA9ICJub2JzIiwgIkFJQyIsICJCSUMiKSkKI25sc19yZXN1bHRzCiNxdWlja19kb2N4KG5sc19yZXN1bHRzLCBmaWxlID0gIi4vbmxzX3Jlc3VsdHMuZG9jeCIpCmBgYAoKYGBge3IgZ2V0IHBhcmFtZXRlcnMgYW5kIHByZXBhcmUgZGF0YSBmb3IgZmFjZXRpbmd9Cmhpa2VfZGF0YV9ubHNfcGFyYW1zIDwtIGxpc3QoCiAgaGlrZV9kYXRhX25scyA9IGhpa2VfZGF0YSAlPiUgZ3JvdXBfYnkoZGF0YSkgJT4lCiAgZG8obmxzX2ZpdCA9IHRpZHkobmxzKHNwZWVkIH4gdG9ibGVyX2YoYSwgZyA9IGdyYWRpZW50LCBiMSwgYjIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBsaXN0KGEgPSA2LCBiMSA9IDMuNSwgYjIgPSAwLjA1KSwgZGF0YSA9IC4pKSkgJT4lIAogIHVubmVzdChubHNfZml0KSAlPiUgbXV0YXRlKHR5cGUgPSAicmF3IiksCgogIGhpa2VfZGF0YV9iaW5uZWRfbmxzID0gaGlrZV9kYXRhX2Jpbm5lZCAlPiUgZ3JvdXBfYnkoZGF0YSkgJT4lCiAgZG8obmxzX2ZpdCA9IHRpZHkobmxzKHNwZWVkIH4gdG9ibGVyX2YoYSwgZyA9IGdyYWRpZW50LCBiMSwgYjIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBsaXN0KGEgPSA2LCBiMSA9IDMuNSwgYjIgPSAwLjA1KSwgZGF0YSA9IC4pKSkgJT4lIAogIHVubmVzdChubHNfZml0KSAlPiUgbXV0YXRlKHR5cGUgPSAiYmlubmVkIikKKQoKaGlrZV9kYXRhX25sc19wYXJhbXMgPC0gYmluZF9yb3dzKGhpa2VfZGF0YV9ubHNfcGFyYW1zKSAlPiUgCiAgbXV0YXRlKGVzdGltYXRlID0gaWZfZWxzZShwLnZhbHVlIDw9IDAuMDUsIGVzdGltYXRlLCAwKSkgJT4lIAogIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBjKGRhdGEsIHR5cGUpLCBuYW1lc19mcm9tID0gYyh0ZXJtKSwgdmFsdWVzX2Zyb20gPSBlc3RpbWF0ZSkKCmZhY2V0X2RhdGEgPC0gcmJpbmQoaGlrZV9kYXRhICU+JSB0cmFuc211dGUoZGF0YSwgc3BlZWQsIGdyYWRpZW50LCB0eXBlKSwgCiAgICAgICAgICAgICAgICAgICAgaGlrZV9kYXRhX2Jpbm5lZCAlPiUgdHJhbnNtdXRlKGRhdGEsIHNwZWVkLCBncmFkaWVudCwgdHlwZSkpICU+JSAKICBsZWZ0X2pvaW4oaGlrZV9kYXRhX25sc19wYXJhbXMsIGJ5ID0gYygiZGF0YSIsICJ0eXBlIikpICU+JSAKICAjIGFkZCBpbiBzb21lIGR1bW15IG9uZXMgZXF1YWwgdG8gYjIgc28gdGhhdCB0aGUgZnVuY3Rpb24gbGluZSByZWFjaGVzIGl0cyBtYXggaW4gdGhlIGdyYXBocwogIHJiaW5kKGhpa2VfZGF0YV9ubHNfcGFyYW1zICU+JSB0cmFuc211dGUoZGF0YSwgc3BlZWQgPSAwLCBncmFkaWVudCA9IC0xKmIyLCB0eXBlLCBhLCBiMSwgYjIpKSAlPiUKICAKICAjIGNhbGN1bGF0ZSBwcmVkaWN0ZWQgc3BlZWRzIGZvciBsZWZ0IGFuZCByaWdodCBzaWRlcyBvZiBmdW5jdGlvbiBsaW5lCiAgbXV0YXRlKHByZWRfc3BlZWRfbCA9IGlmX2Vsc2UoZ3JhZGllbnQgPD0gLTEqYjIsIHRvYmxlcl9mKGEgPSBhLCBnID0gZ3JhZGllbnQsIGIxID0gYjEsIGIyID0gYjIpLCBOQV9yZWFsXyksCiAgICAgICAgIHByZWRfc3BlZWRfciA9IGlmX2Vsc2UoZ3JhZGllbnQgPj0gLTEqYjIsIHRvYmxlcl9mKGEgPSBhLCBnID0gZ3JhZGllbnQsIGIxID0gYjEsIGIyID0gYjIpLCBOQV9yZWFsXyksCiAgICAgICAgIGRhdGEgPSBmY3RfcmVsZXZlbChkYXRhLCAiaGlrZV8xcyIsICJoaWtlXzNzIiwgImhpa2VfNXMiLCAiaGlrZV8xMHMiKSwKICAgICAgICAgdHlwZSA9IGZjdF9yZWxldmVsKHR5cGUsICJyYXciLCAiYmlubmVkIikpIAoKIyBjcmVhdGUgc29tZSBmYWtlIGRhdGEgZm9yIHRoZSB0b2JsZXIgZnVuY3Rpb24gbGluZQp0b2JsZXJfZGYgPC0gZGF0YS5mcmFtZShncmFkaWVudCA9IHNlcShmcm9tID0gLTEsIHRvID0gMSwgYnk9MC4wMSkpICU+JSAKICBtdXRhdGUoZ3JhZGllbnQgPSByb3VuZChncmFkaWVudCwgMiksICMgcm91bmQgc28gdGhhdCBmbG9hdHMgY2FuIGJlIGNvbXBhcmVkCiAgICAgICAgIHNwZWVkX2wgPSBpZl9lbHNlKGdyYWRpZW50IDw9IC0wLjA1LCB0b2JsZXJfZihhID0gNiwgZyA9IGdyYWRpZW50LCBiMSA9IDMuNSwgYjIgPSAwLjA1KSwgTkFfcmVhbF8pLAogICAgICAgICBzcGVlZF9yID0gaWZfZWxzZShncmFkaWVudCA+PSAtMC4wNSwgdG9ibGVyX2YoYSA9IDYsIGcgPSBncmFkaWVudCwgYjEgPSAzLjUsIGIyID0gMC4wNSksIE5BX3JlYWxfKSkKYGBgCgpgYGB7ciBncmFwaCBmaXQgbW9kZWxzLCB3YXJuaW5nID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0KZmlnXzIgPC0gZ2dwbG90KGZhY2V0X2RhdGEsIGFlcyhncmFkaWVudCwgc3BlZWQpKSArIAogIHRoZW1lX2J3KCkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGF0YSksIHJvd3MgPSB2YXJzKHR5cGUpKSArCiAgZ2VvbV9wb2ludChzaXplID0gLjUsIGNvbG91ciA9ICJncmV5ODAiKSArCiAgeWxpbSgwLCA4KSArCiAgeGxhYigiZ3JhZGllbnQiKSArCiAgeWxhYigidHJhdmVsIHNwZWVkIChrbS9oKSIpICsKICBsYWJzKGNvbG91cj0iaW1wZWRhbmNlIGYiKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0xLCAxKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KC4yNSwgImxpbmVzIiksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHN0YXRfc21vb3RoKGFlcyh4ID0gZ3JhZGllbnQsIHkgPSBzcGVlZF9sLCBjb2xvdXIgPSAiVEhGIiksIHNlID0gRkFMU0UsIGZvcm11bGEgPSB5IH4geCwgbWV0aG9kID0gImxvZXNzIiwgZGF0YSA9IHRvYmxlcl9kZikgKwogIHN0YXRfc21vb3RoKGFlcyh4ID0gZ3JhZGllbnQsIHkgPSBzcGVlZF9yLCBjb2xvdXIgPSAiVEhGIiksIHNlID0gRkFMU0UsIGZvcm11bGEgPSB5IH4geCwgbWV0aG9kID0gImxvZXNzIiwgZGF0YSA9IHRvYmxlcl9kZikgKwogIHN0YXRfc21vb3RoKGFlcyh4ID0gZ3JhZGllbnQsIHkgPSBwcmVkX3NwZWVkX2wsIGNvbG91ciA9ICJOTFMgRml0IiksIG1ldGhvZCA9ICJnYW0iLCBmb3JtdWxhID0gIHkgfiBzKHgsIGJzID0gImNzIiksIHNlID0gRkFMU0UpICsKICBzdGF0X3Ntb290aChhZXMoeCA9IGdyYWRpZW50LCB5ID0gcHJlZF9zcGVlZF9yLCBjb2xvdXIgPSAiTkxTIEZpdCIpLCBtZXRob2QgPSAiZ2FtIiwgZm9ybXVsYSA9ICB5IH4gcyh4LCBicyA9ICJjcyIpLCBzZSA9IEZBTFNFKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbChuYW1lPSJsZWdlbmQiLCB2YWx1ZXM9YygiI0U0MUExQyIsICIjMzc3RUI4IikpCgpnZ3NhdmUoZmlnXzIsIGZpbGVuYW1lID0gIi4vaW1nL0ZpZ18yLmpwZyIsIGRldmljZSA9ICJqcGciLCB3aWR0aCA9IDcuMjksIGhlaWdodCA9IDQuNTEpCmBgYAoKYGBge3IgYW5hbHl6ZSBhY2Nlc3NpYmlsaXR5IGRhdGF9Cm9kY20gPC0gcmVhZC5jc3YoIi4vZGF0YS9PRENvc3RNYXRyaXhfT3V0cHV0LmNzdiIpICU+JSAKICBzZXBhcmF0ZShOYW1lLCBpbnRvID0gYygib3JpZ2luIiwgImRlc3RpbmF0aW9uIiksIHNlcCA9ICIgLSAiKSAlPiUgCiAgbXV0YXRlKGFjY2Vzc19OTFMgPSBjYXNlX3doZW4oVG90YWxfV2Fsa19OTFMgPD0gMTUgfiAxLCBUUlVFIH4gMCksCiAgICAgICAgIGFjY2Vzc19UT0IgPSBjYXNlX3doZW4oVG90YWxfV2Fsa19Ub2JsZXIgPD0gMTUgfiAxLCBUUlVFIH4gMCksCiAgICAgICAgIGFjY2Vzc18yRCA9IGNhc2Vfd2hlbihUb3RhbF9XYWxrXzJEIDw9IDE1IH4gMSwgVFJVRSB+IDApKQoKYWNjZXNzX3Jlc3VsdHMgPC0gb2RjbSAlPiUgc3VtbWFyaXplKGFjY2Vzc19OTFMgPSBzdW0oYWNjZXNzX05MUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfVE9CID0gc3VtKGFjY2Vzc19UT0IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzXzJEID0gc3VtKGFjY2Vzc18yRCkpCmBgYAoKIyBRVUVTVElPTlMKSG9uZyBLb25nIGlzIGFuIGludGVuc2VseSB0aHJlZS1kaW1lbnNpb25hbCBjaXR5LCBub3Qgb25seSBpbiB0ZXJtcyBvZiBpdHMgY29tcGxleCDigJh2b2x1bWV0cmlj4oCZIGJ1aWx0IGVudmlyb25tZW50IChCcnV5bnMgZXQgYWwuLCAyMDIxKSwgYnV0IGFsc28gaXRzIG1vdW50YWlub3VzIHRlcnJhaW4uIFdoaWxlIHdvcmtpbmcgYXQgdGhlIEhvbmcgS29uZyBQb2x5dGVjaG5pYyBVbml2ZXJzaXR5LCBJIHRvb2sgdXAgaGlraW5nIG9uIHRoZSBjaXR54oCZcyBleHRlbnNpdmUgdHJhaWwgbmV0d29yay4gQnV0IGFzIGEgcXVhbnRpdGF0aXZlIGdlb2dyYXBoZXIgd2l0aCBhIGdlbmVyYWwgaW50ZXJlc3QgaW4gdGhlIHBvdGVudGlhbCBvZiBzZW5zb3JzIGZvciBwZXJzb25hbGl6ZWQgdXJiYW4gZGF0YSBhbmFseXNpcywgSSBjb3VsZCBub3QgaGVscCBidXQgdG8gY29tYmluZSB3b3JrIGFuZCBsZWlzdXJlIGFjdGl2aXRpZXMgYW5kIHV0aWxpemVkIG15IG1vYmlsZSBwaG9uZSBhbmQgc21hcnQgd2F0Y2ggdG8gY2FwdHVyZSBkYXRhIG9uIG15IHBoeXNpY2FsIHBlcmZvcm1hbmNlLiBJbiBwYXJ0aWN1bGFyLCBJIGFtIGludGVyZXN0ZWQgaW4gaG93IGNsb3NlbHkgbXkgY2FwdHVyZWQgdHJhdmVsIHRyYWplY3RvcmllcyBhbGlnbiB3aXRoIFRvYmxlcuKAmXMgKDE5OTMpIOKAmGhpa2luZyBmdW5jdGlvbuKAmSBhbmQgaG93IHRoZSBjYWxpYnJhdGVkIGNvc3QgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIHBlcnNvbmFsaXplZCBwcmVkaWN0aXZlIGFjY2Vzc2liaWxpdHkgYW5hbHlzaXMgaW4gYSAzRCBuZXR3b3JrIGNvbnRleHQuIAoKV2hpbGUgVG9ibGVy4oCZcyBIaWtpbmcgRnVuY3Rpb24gKFRIRikgaGFzIGEgbG9uZyBoaXN0b3J5IG9mIGFwcGxpY2F0aW9ucyBpbiB0aGUgZmllbGQgb2YgYXJjaGFlb2xvZ3ksIEdvb2RjaGlsZCAoMjAyMCkgY29tbWVudHMgb24gdGhlIGluY3JlYXNpbmcgdXNlZnVsbmVzcyBvZiBoaWtpbmcgZnVuY3Rpb25zIGluIGEgdmFyaWV0eSBvZiB0b3BpYyBhcmVhcyBpbiBnZW9ncmFwaGljYWwgYW5hbHlzaXMgKGFuZCBpbmNsdWRlcyBhbiBlYXJseSBncmFwaCBvZiB0aGlzIHBhcGVy4oCZcyBkYXRhKS4gSW5kZWVkLCB0aGUgVEhGIGlzIGluY3JlYXNpbmdseSB1dGlsaXplZCBpbiB0cmFuc3BvcnQgZ2VvZ3JhcGh5IGFzIGEgY29zdCBmdW5jdGlvbiBpbiAzRCBzdXJmYWNlIChlLmcuIHdhdGVyIGFjY2VzcyBpbiBQw6FleiBldCBhbC4gKDIwMjApKSBhbmQgbGluZWFyIG5ldHdvcmsgKGUuZy4gYWNjZXNzIHRvIHJhcGlkIHRyYW5zaXQgc3RhdGlvbnMgaW4gSGlnZ2lucyAoMjAxOSkpIGFuYWx5c2lzLiBPdGhlciByZXNlYXJjaGVycyBoYXZlIHV0aWxpemVkIG5ldyBzb3VyY2VzIG9mIGFjdGl2aXR5IGRhdGEgdG8gY2FsaWJyYXRlIGRpZmZlcmVudCBjb3N0IGZ1bmN0aW9ucyAoQnJ1bmRzb24sIDIwMTg7IENhbXBiZWxsIGV0IGFsLiwgMjAxOTsgSXJtaXNjaGVyICYgQ2xhcmtlLCAyMDE4OyBQaW5nZWwsIDIwMTApLiBTb21lIHZlcnNpb24gb2YgdGhlIFRIRiBhbHNvIGFwcGVhcnMgdG8gdW5kZXJwaW4gcm91dGluZyBzdWdnZXN0aW9ucyBvbiBzbG9wZWQgdGVycmFpbiBpbiBHb29nbGUgTWFwcyAoR29vZGNoaWxkLCAyMDIwKS4gSG93ZXZlciwgbm8gcmVzZWFyY2ggaGFzIGNhbGlicmF0ZWQgYSBiZXNwb2tlIGNvc3QgZnVuY3Rpb24gYW5kIGVtcGxveWVkIGl0IGZvciBwZXJzb25hbGl6ZWQgdXJiYW4gYWNjZXNzaWJpbGl0eSBhbmFseXNpcy4KCiMgTUVUSE9EUwpQdWJsaXNoZWQgc2V2ZXJhbCBkZWNhZGVzIGFnbywgVG9ibGVyIGNhbGlicmF0ZWQgdGhlIGhpa2luZyBmdW5jdGlvbiB0byBjb2Fyc2UgaXNvbGluZSBkYXRhIGZyb20gSW1ob2YgKDE5NTApIGFuZCB1c2VzIGFuIGV4cG9uZW50aWFsIGZ1bmN0aW9uIHRvIG1vZGVsIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdmVsb2NpdHkgYW5kIHNsb3BlOgoKJCQKdiA9IFxhbHBoYSAqIGVeeygtXGJldGFfMSB8ZyArIFxiZXRhXzJ8KX0KJCQKCldoZXJlICR2JCBpcyB3YWxraW5nIHZlbG9jaXR5IGluIGttL2gsICRcYWxwaGEkIGlzIGEgY29uc3RhbnQgdGhhdCBjb250cm9scyB0aGUgbWF4aW11bSB2ZWxvY2l0eSwgJGckIGlzIHRoZSBncmFkaWVudCBvZiB0aGUgdGVycmFpbiBtZWFzdXJlZCBhcyB0aGUgdGFuZ2VudCBvZiB0aGUgYW5nbGUgb2YgdGhlIHNsb3BlIGluIHRoZSBkaXJlY3Rpb24gb2YgdHJhdmVsLCAkXGJldGFfMSQgY29udHJvbHMgdGhlIHJhdGUgb2YgZGVjbGluZSBhcyB0aGUgZ3JhZGllbnQgaW5jcmVhc2VzLCBhbmQgJFxiZXRhXzIkIG9mZnNldHMgdGhlIGdyYWRpZW50IGJ5IHNvbWUgYW1vdW50IHRvIGNhcHR1cmUgaG93IHdhbGtpbmcgc3BlZWRzIGFyZSBoaWdoZXN0IG9uIGEgc2xpZ2h0IGRvd253YXJkIGdyYWRpZW50LiBJbiBUb2JsZXLigJlzIG9yaWdpbmFsIGZvcm11bGF0aW9uLCAkXGFscGhhID0gNiBrcGgkLCAkXGJldGFfMSA9IDMuNSQsIGFuZCAkXGJldGFfMiA9IDAuMDUkIHNvIHRoYXQgdGhlIG1heGltdW0gd2Fsa2luZyB2ZWxvY2l0eSBvZiA2IGttL2ggaXMgYWNoaWV2ZWQgYXQgYSBncmFkaWVudCBvZiAtNSUuIAoKVG8gYW5zd2VyIHRoZSByZXNlYXJjaCBxdWVzdGlvbnMgcG9zZWQgZWFybGllciwgSSBjb2xsZWN0ZWQgdHJhamVjdG9yeSBkYXRhIG92ZXIgNCBoaWtlcyBvbiB0aGUgdHJhaWxzIGFyb3VuZCBMdW5nIEZ1IFNoYW4gcGVhayBhbmQgdGhlIFBpbmV3b29kIEJhdHRlcnkgYmVoaW5kIHRoZSBVbml2ZXJzaXR5IG9mIEhvbmcgS29uZyBpbiBDZW50cmFsIGFuZCBXZXN0ZXJuIERpc3RyaWN0IGluIDIwMTguIFRoZSB0cmFpbHMgdGhlbXNlbHZlcyBmZWF0dXJlIGEgbWl4IG9mIHBhdmVkIHNlZ21lbnRzIGFuZCBkaXJ0IHBhdGhzIGFzIHdlbGwgYXMgc3RhaXJzIGF0IHRoZSBzdGVlcGVzdCBzZWN0aW9ucywgbWFraW5nIHRoZW0gYSB1c2VmdWwgcHJveHkgZm9yIG1vcmUgdXJiYW4gd2Fsa2luZy4gRGF0YSB3ZXJlIGNvbGxlY3RlZCB1c2luZyBhbiBBcHBsZSBpUGhvbmUgOCBhbmQgQXBwbGUgV2F0Y2ggU2VyaWVzIDAgdGhyb3VnaCB0aGUg4oCYT3V0ZG9vciBXYWxr4oCZIHRyYWNraW5nIGluIHRoZSBGaXRuZXNzIGFwcGxpY2F0aW9uLiBUaGlzIGRldmljZSBjb21iaW5hdGlvbiBjYXB0dXJlcyBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIHBvc2l0aW9uaW5nIHVzaW5nIHRoZSBpUGhvbmXigJlzIEdQUyByZWNlaXZlciwgaGVpZ2h0IGZyb20gc2VhIGxldmVsIHVzaW5nIHRoZSBiYXJvbWV0ZXIgKHByZWNpc2lvbiBvZiAwLjFtKSwgYW5kIGhlYXJ0IHJhdGUgcmVhZGluZ3MgdXNpbmcgdGhlIGhlYXJ0IHJhdGUgbW9uaXRvciBvbiB0aGUgQXBwbGUgV2F0Y2guIFRoZSBwaG9uZSBhcHBsaWVzIHNvbWUgc21vb3RoaW5nIGFsZ29yaXRobSB0byB0aGUgR1BTIGRhdGEgYW5kIGNhbiBhbHNvIHVzZSB0aGUgYWNjZWxlcm9tZXRlciBhbmQgZ3lyb3Njb3BlIGluIHRoZSB3YXRjaCB0byBhdWdtZW50IEdQUyBwb3NpdGlvbmFsIGFjY3VyYWN5IGluIGFyZWFzIHdpdGggcG9vciBvciBubyBHUFMgc2lnbmFsLCBhbHRob3VnaCB0aGVzZSBmZWF0dXJlcyBhcmUgb3BhcXVlIHRvIHRoZSB1c2VyLiBSZWFkaW5ncyB3ZXJlIGNhcHR1cmVkIGZyb20gdGhlIHNlbnNvcnMgYXQgMS1zZWNvbmQgaW50ZXJ2YWxzLiBUaGUgcmVzdWx0aW5nIHdvcmtvdXRzIHdlcmUgZXhwb3J0ZWQgYXMgZ3B4IGZpbGVzIHVzaW5nIHRoZSBSdW4gR2FwIGFwcCBmb3IgaU9TLiBUaGUgdHJhamVjdG9yaWVzIHdlcmUgY2xlYW5lZCB0byByZW1vdmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgd2FsayB0byB0aGUgdHJhaWwgKHdoZXJlIHRoZSBhY2N1cmFjeSBvZiBHUFMgcmVhZGluZ3MgaXMgY29tcHJvbWlzZWQgYnkgdGFsbCBidWlsZGluZ3MpIGFuZCBhIGhhbmRmdWwgb2Ygc3RvcHMgdG8gcmVzdCBkdXJpbmcgdGhlIGhpa2UuIFRoZSBleHBvcnRlZCB0cmFqZWN0b3JpZXMgYW5kIGVsZXZhdGlvbiBwcm9maWxlIGZvciBvbmUgb2YgdGhlIGhpa2VzIGlzIHNob3duIGluIEZpZ3VyZSAxLiAKClRvIGVzdGltYXRlIGFjY2Vzc2liaWxpdHksIGEgM0QgcGVkZXN0cmlhbiBuZXR3b3JrIChMYW5kc0QsIDIwMjE7IFN1biBldCBhbC4sIDIwMTkpIGlzIHByZXBhcmVkIGluIGEgc2ltaWxhciBtYW5uZXIgdG8gdGhhdCBvdXRsaW5lZCBpbiBIaWdnaW5zICgyMDE5YSksIGluY2x1ZGluZyBzcGxpdHRpbmcgbGlua3MgaW50byAxMG0gb3IgbGVzcyBzZWdtZW50cyB0byBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiBzbG9wZS1iYXNlZCB0cmF2ZWwgdGltZXMgYW5kIHNwZWNpZnlpbmcgYW5pc290cm9waWMgdHJhdmVsIGNvc3RzLiBGb3Igc2ltcGxpY2l0eSwgdGhlIHRyYXZlbCBzcGVlZCBvZiBhbnkgbWVjaGFuaXplZCBsaW5rcyAoZS5nLiB0cmF2ZWxhdG9yLCBlbGV2YXRvcikgaXMgc2V0IHRvIDJrbS9oLiBPcmlnaW5zIGFuZCBkZXN0aW5hdGlvbnMgZm9yIHRoZSBhY2Nlc3NpYmlsaXR5IGFuYWx5c2lzIGNvcnJlc3BvbmQgdG8gYnVpbGRpbmcgY2VudHJvaWRzIGluIHRoZSBoaWxseSBDZW50cmFsIGFuZCBXZXN0ZXJuIERpc3RyaWN0IGFuZCB0cmF2ZWwgdGltZXMgYXJlIG1vZGVsbGVkIHVzaW5nIEFyY0dJUyBQcm8uCgpgYGB7ciBmaWcgMSwgZmlnLmNhcD0iRmlndXJlIDEuIEFwcmlsIDI5IEhpa2UgVHJhamVjdG9yeSBhbmQgUHJvZmlsZSIsIG91dC53aWR0aCA9ICcxMDAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi4vaW1nL0ZpZ18xLmpwZyIpCmBgYAoKIyBGSU5ESU5HUwpUbyBjb21wYXJlIG15IHdhbGsgc3BlZWQgd2l0aCB0aGF0IHByZWRpY3RlZCBieSBUb2JsZXLigJlzIGZ1bmN0aW9uLCBub25saW5lYXIgbGVhc3Qgc3F1YXJlcyB3YXMgdXNlZCB0byBmaXQgRXEuIDEgdG8gdGhlIGRhdGEgYW5kIHJlc3VsdHMgYXJlIHByZXNlbnRlZCBpbiBUYWJsZSAxIGFuZCBncmFwaGVkIGluIEZpZ3VyZSAyLiBUbyB0ZXN0IHRoZSBzZW5zaXRpdml0eSBvZiB0aGUgZXN0aW1hdGVkIHJlc3VsdHMgdG8gdGhlIHRlbXBvcmFsIHNjYWxlIG9mIHRoZSB0cmFqZWN0b3J5IGRhdGEsIEkgZW1wbG95ZWQgdHdvIGFnZ3JlZ2F0aW9uIHN0cmF0ZWdpZXMgaW5jbHVkaW5nIGNvbGxhcHNpbmcgY29sbGFwc2VkIHRoZSB0cmFqZWN0b3JpZXMgaW50byAzcywgNXMsIGFuZCAxMHMgdGltZSBpbnRlcnZhbHMgYW5kIGNhbGN1bGF0aW5nIGF2ZXJhZ2Ugc3BlZWRzIGF0IDElIGdyYWRpZW50IGludGVydmFscy4gVGhlIHNlbnNpdGl2aXR5IGFuYWx5c2lzIHN1Z2dlc3RzIHRoYXQgdGhlIG1vZGVscyBhcmUgcmVhc29uYWJseSBzdGFibGUgaW4gcGFyYW1ldGVycy4gVGhlIGV4Y2VwdGlvbiBpcyB0aGUgJFxiZXRhXzIkIG9mZnNldCBwYXJhbWV0ZXIgd2hpY2ggaXMgaW5zaWduaWZpY2FudCBpbiBhbGwgYmlubmVkIG1vZGVscywgaW5kaWNhdGluZyB0aGUgY29zdCBjdXJ2ZXMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXN0aW1hdGVkIHRvIGJlIHN5bW1ldHJpYyBhcm91bmQgYSAwJSBncmFkaWVudC4gUmVjb2duaXppbmcgdGhhdCBuZWl0aGVyIEFJQyBvciBCSUMgYXJlIHVzZWZ1bCBmb3IgY29tcGFyaW5nIG1vZGVsIGZpdCBhY3Jvc3MgZGlmZmVyZW50IHNhbXBsZSBzaXplcywgSSBmb2N1cyBvbiB0aGUgcmVzdWx0cyBmb3IgdGhlIG9yaWdpbmFsIHJhdyAxcyBkYXRhIGdpdmVuIHRoZSByZWFzb25hYmx5IHN0YWJsZSBwYXJhbWV0ZXIgZXN0aW1hdGVzIGFjcm9zcyBhbGwgbW9kZWwgc3BlY2lmaWNhdGlvbnMuCgpgYGB7ciB0YWJsZSAxfQpubHNfcmVzdWx0cwpgYGAKCmBgYHtyIGZpZyAyLCBmaWcuY2FwPSJGaWd1cmUgMi4gVEhGIGFuZCBOTFMgRml0IEZ1bmN0aW9ucyIsIG91dC53aWR0aCA9ICcxMDAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi4vaW1nL0ZpZ18yLmpwZyIpCmBgYAoKUmVzdWx0cyBmcm9tIHRoZSAxcyByYXcgbW9kZWwgaW5kaWNhdGUgdGhhdCBteSBtYXhpbXVtIGF2ZXJhZ2Ugd2Fsa2luZyBzcGVlZCBpcyBhIGJpdCBzbG93ZXIgdGhhbiB3aGF0IFRvYmxlciAoMTk5Mykgd291bGQgcHJlZGljdCBhdCBhYm91dCA0LjQga20vaC4gVGhlIGZpdCBmdW5jdGlvbiBzdWdnZXN0cyBteSBtYXhpbXVtIHdhbGtpbmcgc3BlZWQgb2YgYWJvdXQgNC42a20vaCBvY2N1cnMgb24gYWJvdXQgYSAtMy4zJSBncmFkaWVudCByYXRoZXIgdGhhbiB0aGUgLTUlIGluIFRvYmxlcuKAmXMgZm9ybXVsYXRpb24uIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgSSB0ZW5kIHRvIGJlIGZhc3RlciBhdCBoaWdoZXIgc2xvcGVzIHRoYW4gcHJlZGljdGVkIGJ5IHRoZSBvcmlnaW5hbCBUSEYsIGxpa2VseSBkdWUgdG8gdGhlIHByZXZhbGVuY2Ugb2Ygc3RhaXJjYXNlcyBvbiB0aGUgc3RlZXBlc3Qgc2VjdGlvbnMgb2YgdGhlIHRyYWlsLgoKVG8gZXN0aW1hdGUgdGhlIGVmZmVjdHMgb2YgdGhlIGNvc3QgZnVuY3Rpb24gb24gcGVyc29uYWxpemVkIGFjY2Vzc2liaWxpdHkgYW5hbHlzaXMsIGEgc2ltcGxlIHNjZW5hcmlvIGlzIGNyYWZ0ZWQgd2hlcmVpbiBJIGV4YW1pbmUgdGhlIHNwYXRpYWwgZGlzdHJpYnV0aW9uIG9mIGJ1aWxkaW5ncyB0aGF0IGhhdmUgYWNjZXNzIHRvIHRoZSBLaW53aWNrIENlbnRyZSB3aXRoaW4gMTUgbWluIG9mIHdhbGtpbmcuIFNpdHVhdGVkIGluIHRoZSBTb0hvIG5laWdoYm91cmhvb2QsIHRoZSBLaW53aWNrIENlbnRyZSBob3VzZXMgYSBncm9jZXJ5IHN0b3JlIGFuZCBneW0gYW5kIGlzIGFuIGludGVyZXN0aW5nIGRlc3RpbmF0aW9uIGR1ZSB0byBpdHMgbG9jYXRpb24gaW4gdGhlIHRvcG9ncmFwaGljYWxseS1yaWNoIFNvSG8gbmVpZ2hib3VyaG9vZCBhYm91dCBoYWxmd2F5IHVwIHRoZSA4MDBtIENlbnRyYWwtTWlkLUxldmVscyBlc2NhbGF0b3Igc3lzdGVtLiBGaWd1cmUgMyBzaG93cyBhIDE1IG1pbiBpc29jaHJvbmUgY2FsY3VsYXRlZCB0byB0aGUgS2lud2ljayBDZW50cmUgdXNpbmcgdGhlIGNvc3QgZnVuY3Rpb24gY2FsaWJyYXRlZCB0byBteSAxcyBkYXRhLiAKCmBgYHtyIGZpZyAzLCBmaWcuY2FwPSJGaWd1cmUgMy4gV2FsayBBY2Nlc3MgSXNvY2hyb25lIC0gTkxTIEZpdCBGdW5jdGlvbiIsIG91dC53aWR0aCA9ICcxMDAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi4vaW1nL0ZpZ18zLmpwZyIpCmBgYAoKQWZ0ZXIgcnVubmluZyBhbiBvcmlnaW4tZGVzdGluYXRpb24gY29zdCBtYXRyaXggY2FsY3VsYXRpb24sIGFjY2Vzc2liaWxpdHkgcmVzdWx0cyByZXZlYWwgdGhhdCB0aGUgZnVuY3Rpb24gZml0IHRvIG15IHRyYXZlbCBwZXJmb3JtYW5jZSByZXN1bHRzIGluIGByIHByZXR0eU51bSgoYWNjZXNzX3Jlc3VsdHNbMSwxXSksIGJpZy5tYXJrID0gIiwiKWAgYnVpbGRpbmdzIHdpdGhpbiBhIDE1IG1pbiB3YWxrIHRvIHRoZSBLaW53aWNrIENlbnRyZSwgd2hpY2ggaXMgYHIgcHJldHR5TnVtKHJvdW5kKCgoYWNjZXNzX3Jlc3VsdHNbMSwxXS9hY2Nlc3NfcmVzdWx0c1sxLDJdKS0xKSoxMDAsIDEpKWAlIG1vcmUgdGhhbiB0aGUgbnVtYmVyIGVzdGltYXRlZCB1c2luZyB0aGUgb3JpZ2luYWwgVEhGLiBCZXlvbmQgbXkgYmFzZSBwaHlzaWNhbCBhYmlsaXR5LCBpdCBzZWVtcyBsaWtlbHkgdGhhdCB0aGlzIGlzIGFuIG91dGNvbWUgb2YgdGhlIHN0YWlyY2FzZXMgaW4gdGhlIGhpa2luZyB0cmFqZWN0b3JpZXMuIFdoaWxlIHRoZSBwcmVzZW5jZSBvZiBzdGFpcmNhc2VzIGRpZmZlcnMgZnJvbSB0aGUgdW5pbXByb3ZlZCB0ZXJyYWluIHVzZWQgdG8gY2FsaWJyYXRlIHRoZSBvcmlnaW5hbCBUSEYgYW5kIGFmZmVjdHMgdGhlIGNvbXBhcmFiaWxpdHkgb2YgdGhlIGNvc3QgZnVuY3Rpb25zLCB0aGUgdHJhaWwgY29udGV4dCB1c2VkIHRvIGNhbGlicmF0ZSBteSBjb3N0IGZ1bmN0aW9uIGlzIGFyZ3VhYmx5IG1vcmUgcmVmbGVjdGl2ZSBvZiB3YWxraW5nIGNvbmRpdGlvbnMgaW4gYW4gdXJiYW4gY29udGV4dCB3aGVyZSBzdGFpcnMgYXJlIHVzZWQgdG8gZW5hYmxlIGhpZ2hlciBzcGVlZHMgb24gc3RlZXBlciBzbG9wZXMuIEZvciBjb21wYXJpc29uLCBhc3N1bWluZyB0aGUgbmV0d29yayB3YXMgMkQgd291bGQgcmVzdWx0IGluIGByIHByZXR0eU51bSgoYWNjZXNzX3Jlc3VsdHNbMSwzXSksIGJpZy5tYXJrID0gIiwiKWAgYnVpbGRpbmdzIHdpdGhpbiBhIDE1IG1pbiB3YWxrIHdoaWNoIHdvdWxkIG92ZXJlc3RpbWF0ZSBteSBhY2Nlc3NpYmlsaXR5IGJ5IGFib3V0IGByIHByZXR0eU51bShyb3VuZCgoKGFjY2Vzc19yZXN1bHRzWzEsM10vYWNjZXNzX3Jlc3VsdHNbMSwxXSktMSkqMTAwLCAxKSlgJSBhbmQgYHIgcHJldHR5TnVtKHJvdW5kKCgoYWNjZXNzX3Jlc3VsdHNbMSwzXS9hY2Nlc3NfcmVzdWx0c1sxLDJdKS0xKSoxMDAsIDEpKWAlIGNvbXBhcmVkIHRvIHRoZSAzRCBuZXR3b3JrIHVzaW5nIG15IGZpdCBmdW5jdGlvbiBhbmQgdGhlIFRIRiByZXNwZWN0aXZlbHkuCgpXaGlsZSB0aGUgZGF0YSB1bmNlcnRhaW50eSBjYXZlYXRzIG91dGxpbmVkIGluIEdvb2RjaGlsZCAoMjAyMCkgYXBwbHkgaW4gdGhlIGNhbGlicmF0aW9uIG9mIHRoZSBiZXNwb2tlIGNvc3QgZnVuY3Rpb24gYW5kIHByb3BhZ2F0ZSB0byB0aGUgYWNjZXNzaWJpbGl0eSBhbmFseXNpcywgdGhlc2UgZmluZGluZ3MgaW5kaWNhdGUgdGhlIHN0cm9uZyByb2xlIG9mIGNvc3QgZnVuY3Rpb25zIGluIGNhbGN1bGF0aW5nIGFjY2Vzc2liaWxpdHkgb24gM0QgbmV0d29ya3MsIHRoZSBwb3RlbnRpYWwgb3ZlcmVzdGltYXRpb24gb2YgYWNjZXNzIHRoYXQgY2FuIG9jY3VyIHdoZW4gYXNzdW1pbmcgbmV0d29ya3MgYXJlIHBsYW5hciwgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIHVuZGVyZXN0aW1hdGluZyBhY2Nlc3Mgd2hlbiB1c2luZyB0aGUgVEhGIGNvbXBhcmVkIHRvIGEgY2FsaWJyYXRlZCBmdW5jdGlvbi4gTG9va2luZyBhaGVhZCwgdGhlIHByb2xpZmVyYXRpb24gb2Ygc2Vuc29ycyBvbiBjb25zdW1lci1ncmFkZSBzbWFydCBkZXZpY2VzIHN1Z2dlc3RzIHRoYXQgd2UgYXJlIG5vdCBmYXIgb2ZmIGZyb20gYSBmdXR1cmUgd2hlcmUgdGhlIHN1aXRlIG9mIG1vdmVtZW50IGRhdGEgYmVpbmcgY29sbGVjdGVkIGNhbiBiZSB1dGlsaXplZCB0byBwZXJzb25hbGl6ZSBzdWdnZXN0aW9ucyBmb3Igcm91dGluZyBhbmQgYW5hbHlzZXMgb2YgYWNjZXNzaWJpbGl0eSB3aGVuIHVzaW5nIGFjdGl2ZSBtb2RlcyBvbiBuZXR3b3JrcyByaWNoIGluIHRvcG9ncmFwaHkuIAoKIyBSRUZFUkVOQ0VTCgpCcnVuZHNvbiwgQy4gKDIwMTgpLiBUb2JsZXLigJlzIEhpa2luZyBGdW5jdGlvbi4gUmV0cmlldmVkIGZyb20gaHR0cHM6Ly9ycHVicy5jb20vY2hyaXNicnVuc2Rvbi9oaWtpbmcKCkJydXlucywgRy4gSi4sIEhpZ2dpbnMsIEMuIEQuLCAmIE5lbCwgRC4gSC4gKDIwMjApLiBVcmJhbiBWb2x1bWV0cmljczogRnJvbSB2ZXJ0aWNhbCB0byB2b2x1bWV0cmljIHVyYmFuaXphdGlvbiBhbmQgaXRzIGV4dGVuc2lvbnMgdG8gZW1waXJpY2FsIG1vcnBob2xvZ2ljYWwgYW5hbHlzaXMuIFVyYmFuIFN0dWRpZXMsIDEtMTkuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMTc3LzAwNDIwOTgwMjA5MzY5NzAuCgpDYW1wYmVsbCwgTS4gSi4sIERlbm5pc29uLCBQLiBFLiwgQnV0bGVyLCBCLiBXLiwgJiBQYWdlLCBXLiBHLiAoMjAxOSkuIFVzaW5nIGNyb3dkc291cmNlZCBmaXRuZXNzIHRyYWNrZXIgZGF0YSB0byBtb2RlbCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2xvcGUgYW5kIHRyYXZlbCByYXRlcy4gQXBwbGllZCBHZW9ncmFwaHksIDEwNiwgOTMtMTA3LiBodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmFwZ2VvZy4yMDE5LjAzLjAwOAoKR29vZGNoaWxkLCBNLiBGLiAoMjAyMCkuIEJleW9uZCBUb2JsZXLigJlzIEhpa2luZyBGdW5jdGlvbi4gR2VvZ3JhcGhpY2FsIEFuYWx5c2lzLCA1Mig0KSwgNTU4LTU2OS4gaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvZ2Vhbi4xMjI1MwoKSGlnZ2lucywgQy4gRC4gKDIwMTkpLiBBIDREIHNwYXRpby10ZW1wb3JhbCBhcHByb2FjaCB0byBtb2RlbGxpbmcgbGFuZCB2YWx1ZSB1cGxpZnQgZnJvbSByYXBpZCB0cmFuc2l0IGluIGhpZ2ggZGVuc2l0eSBhbmQgdG9wb2dyYXBoaWNhbGx5LXJpY2ggY2l0aWVzLiBMYW5kc2NhcGUgYW5kIFVyYmFuIFBsYW5uaW5nLCAxODUsIDY4LTgyLiBodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmxhbmR1cmJwbGFuLjIwMTguMTIuMDExCgpJbWhvZiwgRS4gKDE5NTApLiBHZWxhzIhuZGUgdW5kIEthcnRlLiBadXJpY2g6IFJlbnRzY2guCgpJcm1pc2NoZXIsIEkuIEouLCAmIENsYXJrZSwgSy4gQy4gKDIwMTgpLiBNZWFzdXJpbmcgYW5kIG1vZGVsaW5nIHRoZSBzcGVlZCBvZiBodW1hbiBuYXZpZ2F0aW9uLiBDYXJ0b2dyYXBoeSBhbmQgR2VvZ3JhcGhpYyBJbmZvcm1hdGlvbiBTY2llbmNlLCA0NSgyKSwgMTc3LTE4Ni4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwODAvMTUyMzA0MDYuMjAxNy4xMjkyMTUwCgpMYW5kc0QuICgyMDIxLCBKdW5lKS4gM0QgUGVkZXN0cmlhbiBOZXR3b3JrLiBSZXRyaWV2ZWQgZnJvbSBkYXRhLmdvdi5oazogaHR0cHM6Ly9kYXRhLmdvdi5oay9lbi1kYXRhL2RhdGFzZXQvaGstbGFuZHNkLW9wZW5tYXAtM2QtcGVkZXN0cmlhbi1uZXR3b3JrCgpQw6FleiwgQS4sIEFuanVtLCBaLiwgRGlja3Nvbi1BbmRlcnNvbiwgUy4gRS4sIFNjaHVzdGVyLVdhbGxhY2UsIEMuIEouLCBSYW1vcywgQi4gTS4sICYgSGlnZ2lucywgQy4gRC4gKDIwMjApLiBDb21wYXJpbmcgZGlzdGFuY2UsIHRpbWUsIGFuZCBtZXRhYm9saWMgZW5lcmd5IGNvc3QgZnVuY3Rpb25zIGZvciB3YWxraW5nIGFjY2Vzc2liaWxpdHkgaW4gaW5mcmFzdHJ1Y3R1cmUtcG9vciByZWdpb25zLiBKb3VybmFsIG9mIFRyYW5zcG9ydCBHZW9ncmFwaHksIDgyLCAxMDI1NjQuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2ouanRyYW5nZW8uMjAxOS4xMDI1NjQKClBpbmdlbCwgVC4gSi4gKDIwMTApLiBNb2RlbGluZyBTbG9wZSBhcyBhIENvbnRyaWJ1dG9yIHRvIFJvdXRlIFNlbGVjdGlvbiBpbiBNb3VudGFpbm91cyBBcmVhcy4gQ2FydG9ncmFwaHkgYW5kIEdlb2dyYXBoaWMgSW5mb3JtYXRpb24gU2NpZW5jZSwgMzcsIDEzNy0xNDguIGh0dHBzOi8vZG9pLm9yZy8xMC4xNTU5LzE1MjMwNDAxMDc5MTIzMjE2MwoKU3VuLCBHLiwgV2Vic3RlciwgQy4sICYgWmhhbmcsIFguICgyMDE5KS4gQ29ubmVjdGluZyB0aGUgY2l0eTogQSB0aHJlZS1kaW1lbnNpb25hbCBwZWRlc3RyaWFuIG5ldHdvcmsgb2YgSG9uZyBLb25nLiBFbnZpcm9ubWVudCBhbmQgUGxhbm5pbmcgQjogVXJiYW4gQW5hbHl0aWNzIGFuZCBDaXR5IFNjaWVuY2UsIDEtMTYuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMTc3JTJGMjM5OTgwODMxOTg0NzIwNAoKVG9ibGVyLCBXLiAoMTk5MykuIFRocmVlIHByZXNlbnRhdGlvbnMgb24gZ2VvZ3JhcGhpY2FsIGFuYWx5c2lzIGFuZCBtb2RlbGluZy4gU2FudGEgQmFyYmFyYTogTmF0aW9uYWwgQ2VudGVyIGZvciBHZW9ncmFwaGljIEluZm9ybWF0aW9uIGFuZCBBbmFseXNpcy4K